home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 301-325 / disk_319 / cnewssrc / cnews.orig.lzh / conf / setnewsids.c < prev    next >
C/C++ Source or Header  |  1989-06-27  |  2KB  |  94 lines

  1. /*
  2.  * setnewsids - sets ids to news/news, execs relay/relaynews.  Should be setuid
  3. root.
  4.  *    also add NEWSPERMS to the environment.
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <errno.h>
  9. #include <pwd.h>
  10. #include <grp.h>
  11. #include <sys/types.h>
  12.  
  13. #include "news.h"
  14. #include "libc.h"
  15. #include "config.h"
  16.  
  17. #ifndef RELAYNEWS
  18. #define RELAYNEWS binfile("relay/relaynews")
  19. #endif
  20. #ifndef NEWSUSER
  21. #define NEWSUSER "news"
  22. #endif
  23. #ifndef NEWSGROUP
  24. #define NEWSGROUP "news"
  25. #endif
  26.  
  27. char *progname;
  28.  
  29. static int userealids = NO;
  30.  
  31. /*
  32.  * main - parse arguments and handle options
  33.  */
  34. main(argc, argv)
  35. int argc;
  36. char *argv[];
  37. {
  38.     extern int optind;
  39.     extern char *optarg;
  40.  
  41.     progname = argv[0];
  42.  
  43.     /* setuid daemon prelude; various precautions */
  44.     (void) umask(2);    /* undo silly umasks, ignore newsumask() */
  45.     (void) alarm(0);    /* cancel any pending alarm */
  46.     /*
  47.      * Reset certain environment variables to sane values.
  48.      */
  49.     if (putenv("PATH=/bin:/usr/bin") ||
  50.         putenv("IFS= \t\n"))
  51.         exit(1);
  52.     closeall(1);        /* closes all but std descriptors */
  53.     stdfdopen();        /* ensure standard descriptors are open */
  54.  
  55.     setids();        /* change of real and effective ids */
  56.     /* we are now running as news, so you can all relax */
  57.  
  58.     if (putenv("NEWSPERMS="))    /* avoid loops with this marker */
  59.         exit(1);
  60.     execv(RELAYNEWS, argv);    /* re-run relaynews */
  61.     error("can't exec %s", RELAYNEWS);
  62. }
  63.  
  64. setids()            /* change of real and effective ids */
  65. {
  66.     int newsuid = getuid(), newsgid = getgid();    /* default to real ids */
  67.  
  68.     (void) ctlfile((char *)NULL);    /* trigger unprivileged(), set userealids */
  69.     if (!userealids) {
  70.         register struct passwd *pwp;
  71.         register struct group *grp;
  72.  
  73.         pwp = getpwnam(NEWSUSER);
  74.         if (pwp != NULL) {
  75.             newsuid = pwp->pw_uid;
  76.             newsgid = pwp->pw_gid;
  77.         }
  78.         (void) endpwent();
  79.         grp = getgrnam(NEWSGROUP);
  80.         if (grp != NULL)
  81.             newsgid = grp->gr_gid;
  82.         (void) endgrent();
  83.     }
  84.     if (setgid(newsgid) < 0 || setuid(newsuid) < 0)
  85.         error("set[ug]id failed", "");
  86.     /* we are now running as news, so you can all relax */
  87. }
  88.  
  89. void
  90. unprivileged()            /* called if NEWSARTS, NEWSCTL or NEWSBIN present */
  91. {
  92.     userealids = YES;
  93. }
  94.